/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio.Cola;

import java.util.ArrayList;

/**
 *
 * @author Ivan
 */
public class Contenedor <E extends Comparable >{
    private ArrayList<E> contendor;

    public ArrayList<E> getContendor() {
        return contendor;
    }

    public void setContendor(ArrayList<E> contendor) {
        this.contendor = contendor;
    }

    public Contenedor() {
        contendor=new ArrayList<E>();
    }



    public void insertar(E dato)
    {
//        if(contendor.isEmpty())
//        {
//            contendor.add(dato);
//            return;
//        }
//        contendor.add(contendor.size()-1, dato);
        contendor.add(dato);

    }
    public E eliminar() throws Exception
    {
         E retorno=contendor.get(0);
        contendor.remove(retorno);
        return retorno;


    }

    public E eliminarUltimo() throws Exception
    {
        E retorno=contendor.get(contendor.size() - 1);
        contendor.remove(retorno);
        return retorno;
    }


     public boolean estaVacio()
    {
       return contendor.isEmpty();

    }
     public void insertarOrdenado(E dato)
     {
        if(contendor.isEmpty())
        {
            contendor.add(dato);
            return;
        }


        insertarRapido(dato);


     }

     private void insertarRapido(E dato){
         int mitad=contendor.size()/2;

         if(dato.compareTo(contendor.get(mitad))>0)//deber a la izquierda
         {
             this.insertarRapidoExt(dato, 0,mitad);
         }
        else
         {
             this.insertarRapidoExt(dato, mitad, contendor.size()-1);
        }




     }
     private void insertarRapidoExt(E dato, int inicio, int fin){
         int resta=(fin-inicio);
         int mitad=resta/2+inicio;

         if(inicio==fin || resta==1){

              if(dato.compareTo(contendor.get(mitad))>0)//deber a la izquierda
             {
                 contendor.add(inicio,dato);
             }
              else
              {
                 try{
                  if(dato.compareTo(contendor.get(inicio+1))<=0){
                     contendor.add(dato);
                 }
                 else
                      contendor.add(inicio+1, dato);
                  }catch(Exception e){
                      contendor.add(inicio+1, dato);
                  }
              
              }
              return;
              }

         if(dato.compareTo(contendor.get(mitad))>0)//deber a la izquierda
         {
               this.insertarRapidoExt(dato, inicio,mitad);
         }
         else
         {
             this.insertarRapidoExt(dato, mitad, fin);
        }

         
         




     }

    public E getUltimo() {
        return contendor.get(contendor.size()-1);
    }

    public void setUltimo(E ultimo) {
        contendor.set(contendor.size()-1, ultimo);
    }

    

    public void limpiar(){
        this.contendor.clear();
    }

    public boolean contiene(E cosa){
        return contendor.contains(cosa);
    }
    

}
